1 module unde.games.dizzy.omega.scene_loader;
2 
3 import core.memory;
4 import std.concurrency;
5 import std.datetime;
6 import std.stdio;
7 import std.string;
8 import unde.games.collision_detector;
9 import unde.games.obj_loader;
10 
11 private bool scene_load(ref shared ObjFile*[SC] screens,
12     ref immutable string[SC] screen_names,
13     int X, int Y)
14 {
15     if (SC(X,Y) in screen_names && SC(X,Y) !in screens)
16     {
17         screens[SC(X,Y)] =
18             cast (shared) load_objfile(format("models/screen_%02d_%02d.obj", X, Y));
19     }
20     
21     return (SC(X,Y) in screen_names) !is null;
22 }
23 
24 
25 private void scene_loader_iteration(ref shared ObjFile*[SC] screens, 
26     ref immutable string[SC] screen_names,
27     int X, int Y, int L)
28 {
29     scene_load(screens, screen_names, X, Y);
30     scene_load(screens, screen_names, X-1, Y);
31     if ( !scene_load(screens, screen_names, X, Y-1) )
32         scene_load(screens, screen_names, X, Y-2);
33     scene_load(screens, screen_names, X+1, Y);
34     if ( !scene_load(screens, screen_names, X, Y+1) )
35         scene_load(screens, screen_names, X, Y+2);
36 
37     bool collect;
38     while (screens.length > L)
39     {
40         foreach(sc; screens.keys())
41         {
42             if (sc != SC(X, Y) &&
43                 sc != SC(X-1, Y) &&
44                 sc != SC(X, Y-1) &&
45                 sc != SC(X+1, Y) &&
46                 sc != SC(X, Y+1) &&
47                 sc != SC(X, Y-2) &&
48                 sc != SC(X, Y+2))
49             {
50                 screens.remove(sc);
51                 collect = true;
52                 break;
53             }
54         }
55     }
56     
57     if (collect) GC.collect();
58 }
59 
60 void
61 scene_loader(shared ObjFile*[SC] *screens,
62     immutable string[SC] *screen_names,
63     int X, int Y, int L, Tid tid)
64 {
65     try {
66         bool finish;
67         do
68         {
69             scene_loader_iteration(*screens, 
70                 *screen_names, X, Y, L);
71             receiveTimeout( 100.msecs,
72                     (int x, int y)
73                     {
74                         X = x;
75                         Y = y;
76                     },
77                     (bool a) {
78                         finish = a;
79                     },
80                     (OwnerTerminated ot) {
81                         writefln("Abort scene_loader due stopping parent");
82                         finish = true;
83                     } );
84         }
85         while (!finish);
86     } catch (shared(Throwable) exc) {
87         send(tid, exc);
88     }
89 
90     writefln("Finish scene loader");
91     //send(tid, thisTid);
92 }